package BakaNoPackage;

import java.util.*;

/**
 * 
 * @author Jonas Renaudot
 * @date 05.12.2008
 *
 * Interprète une commande fournie pour séparer les arguments
 *
 */
public class Interpreteur {
	private String commande;
	
	private LinkedList<String> args = new LinkedList<String>();
	
	public Interpreteur(String cmd){
		this.commande = cmd;
		
		this.analyse(commande);
	}
	
	
	/**
	 * Analyse a command and return the parameters
	 * @param cmd command to analyse
	 */
	public void analyse(String cmd){
		
		this.commande = "";
		args = new LinkedList<String>();
		
		String arg_courant = "";
		
		int id = 0;
		
		try{
		
			//evite les espaces
			while(id < cmd.length() && cmd.charAt(id) == ' ')
				id ++;
			
			//recupère la commande
			while(id < cmd.length() && cmd.charAt(id) != ' '){
				commande += cmd.charAt(id);
				id ++;
			}
			
			id ++;
			
			//efface les espaces
			while(id < cmd.length() && cmd.charAt(id) == ' ')
				id ++;
			
			//recupération des arguments tant qu'il y en a
			while(id < cmd.length()){
				arg_courant = "";
				while(id < cmd.length() && cmd.charAt(id) != ' '){
					
					//Backslash : on prend le caractère suivant sans autre
					if(cmd.charAt(id) == '\\'){
						id ++;
						arg_courant += cmd.charAt(id);
					}//c'est un double apostrophe ", on récupère tant qu'on a pas un autre double apostrophe "
					else if(cmd.charAt(id) == '"'){
						id ++; //on évite le premier "
						while(id < cmd.length() && cmd.charAt(id) != '"'){
							if(cmd.charAt(id) == '\\'){
								id ++;
								arg_courant += cmd.charAt(id);
							}else{
								arg_courant += cmd.charAt(id);
							}
							id ++;
						}
					}
					else{ //il n'y a qu'un caractère
						arg_courant += cmd.charAt(id);
					}
					id ++;
				}
				id ++;
				args.add(arg_courant);
				
				//on efface les espaces suivant
				while(id < cmd.length() && cmd.charAt(id) == ' ')
					id ++;
			}
		}catch(Exception e){
			System.out.println("Erreur indefinie dans la commande : " + e.getMessage());
		}
	}
	
	/**
	 * 
	 * @return la commande courrante
	 */
	public String getCommande(){
		return commande;
	}
	
	/**
	 * 
	 * @return the number of arguments
	 */
	public int getNombreArguments(){
		return args.size();
	}
	
	/**
	 * 
	 * @param id position de l'argument, commence à 0
	 * @return L'argument correspondant
	 */
	public String getArg(int id){
		return args.get(id);
	}
	
	/**
	 * 
	 * @return la commande demandée
	 */
	public String toString(){
		String str = commande;
		
		for(String a : args){
			str += "\n - " + a;
		}
		
		return str;
	}
}
